package com.cskaoyan.javase.object._3equals.exclusive;

/**
 * 1.equals方法在判断排它性时,可以用两种方式:
 *     a.getClass
 *          这个排它性判断很严格,只要不是同种类型对象,一律返回false
 *
 *     b.instanceof关键字
 *          引用 instanceof 类名/接口名
 *          判断引用所指向的对象,是否是后面类名的对象或者子类对象
 *          注: 如果是抽象类和接口,只可能是子类对象
 *          如果是,就返回true,如果不是,就返回false
 *          如果引用指向null,也会返回false
 *          相对于getClass,instanceof可以接受子类对象的输入,没有那么严格
 *
 * 总之,getClass很严格,只能传入自身对象比较
 * 而instanceof关键字更宽松,可以传入子类对象作比较
 *
 *
 *
 * @since 15:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Cat c1 = new Cat(2000);
        Cat c2 = new Cat(2000);
        System.out.println(c1.equals(c2));

        CatSon c3 = new CatSon(2000, 3000);
        System.out.println(c1.equals(c3));
        System.out.println(c3.equals(c1));
    }
}

class Cat {
    int price;

    public Cat(int price) {
        this.price = price;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        /*if (obj == null || getClass() != obj.getClass()) {
            return false;
        }*/
        // 使用instanceof来判断自反性
        if (!(obj instanceof Cat)) {
            return false;
        }
        return price == ((Cat) obj).price;
    }
}

class CatSon extends Cat {
    int price;

    public CatSon(int price, int price2) {
        super(price);
        this.price = price2;
    }

}